Apache Drill 1.0がリリースされたのでAmazon S3と連携してみた
はじめに
Apache Drill 1.0がリリースされました!
Apache Drillは、NoSQL向けのSQLクエリエンジンで、ファイルシステム上のJSON/CSV/Parquetなどのファイル、Hiveソース、HBase、MongoDBなどに直接SQLクエリを投げることが出来ます。
何はともあれ、触ってみないとどんなモノなのかわかりません。早速試してみました!
やってみた
試した環境はEC2(on Amazon Linux 2015.03)です。
セットアップ
Drillの動作にはJDK 7が必要になりますので、インストールされていることを確認します。
$ java -version java version "1.7.0_79" OpenJDK Runtime Environment (amzn-2.5.5.1.59.amzn1-x86_64 u79-b14) OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
ではDrillの圧縮ファイルをゲットし、展開します。
$ wget http://getdrill.org/drill/download/apache-drill-1.0.0.tar.gz $ tar -xvzf apache-drill-1.0.0.tar.gz
Drillを起動してみます。余談ですが、t2.microではCannot allocate memoryが発生したので、m3.mediumインスタンスを使っています。
$ cd apache-drill-1.0.0 $ bin/drill-embedded 5 21, 2015 10:19:46 午前 org.glassfish.jersey.server.ApplicationHandler initialize 情報: Initiating Jersey application, version Jersey: 2.8 2014-04-29 01:25:26... apache drill 1.0.0 "start your sql engine" 0: jdbc:drill:zk=local>
さらっと起動しました。
JSONファイルを扱う
こういうJSONファイルを用意しました。
$ cat /home/ec2-user/data1.json {"id": 1, "name": "yokota"} {"id": 2, "name": "miyamoto"} {"id": 3, "name": "otaki"} {"id": 4, "name": "ueki"} {"id": 5, "name": "sasaki"}
そしてSQLクエリを投げてみます。
0: jdbc:drill:zk=local> select * from dfs.`/home/ec2-user/data1.json`; +-----+-----------+ | id | name | +-----+-----------+ | 1 | yokota | | 2 | miyamoto | | 3 | otaki | | 4 | ueki | | 5 | sasaki | +-----+-----------+ 5 rows selected (0.425 seconds)
おおー、簡単にできちゃいますね。
CSVファイルを扱う
じゃ、CSVもやってみましょう!
$ cat /home/ec2-user/data2.csv 1,yokoyama 2,kaji 3,ishikawa 4,watanabe
そしてSQLクエリを投げてみます。
0: jdbc:drill:zk=local> select * from dfs.`/home/ec2-user/data2.csv`; +-------------------+ | columns | +-------------------+ | ["1","yokoyama"] | | ["2","kaji"] | | ["3","ishikawa"] | | ["4","watanabe"] | +-------------------+
"columns"という項目の中に配列のように入ってますね。じゃあ分解してみましょう。
0: jdbc:drill:zk=local> select columns[0] as id, columns[1] as name from dfs.`/home/ec2-user/data2.csv`; +-----+-----------+ | id | name | +-----+-----------+ | 1 | yokoyama | | 2 | kaji | | 3 | ishikawa | | 4 | watanabe | +-----+-----------+ 4 rows selected (0.22 seconds)
簡単。素晴らしい。
いろんなSQLクエリをやってみる
まぁ、普通のSQLが使えるので、なんでも出来ます。例えばWHERE。
0: jdbc:drill:zk=local> select * from dfs.`/home/ec2-user/data1.json` where id = 5; +-----+---------+ | id | name | +-----+---------+ | 5 | sasaki | +-----+---------+ 1 row selected (0.544 seconds)
ORDER。
0: jdbc:drill:zk=local> select * from dfs.`/home/ec2-user/data1.json` order by id desc; +-----+-----------+ | id | name | +-----+-----------+ | 5 | sasaki | | 4 | ueki | | 3 | otaki | | 2 | miyamoto | | 1 | yokota | +-----+-----------+ 5 rows selected (1.35 seconds)
JOINだってCONVERTだって使えちゃいます。
Drillを終了する
!quitによって終了出来ます。他細かい使い方はhelpを実行して確認してください。
0: jdbc:drill:zk=local> !quit Closing: org.apache.drill.jdbc.DrillJdbc41Factory$DrillJdbc41Connection
Amazon S3上のファイルをクエリする
では今日の本題です。Running SQL Queries on Amazon S3を参考にしました。
jets3tプラグインの最新版アーカイブを取得して展開し、jarファイルをDrillの中のjars/3rdpartyディレクトリにコピーします。
$ wget http://bitbucket.org/jmurty/jets3t/downloads/jets3t-0.9.3.zip $ unzip jets3t-0.9.3.zip $ cp jets3t-0.9.3/jars/jets3t-0.9.3.jar /home/ec2-user/apache-drill-1.0.0/jars/3rdparty/
次に以下のファイルを編集し、"jets3t"と書かれた行を削除し、プラグインを有効にします。
$ vi /home/ec2-user/apache-drill-1.0.0/bin/hadoop-excludes.txt jets3t ←削除する
そしてEC2からS3へアクセスするための認証情報を記述したconf/core-site.xmlを作成します。
$ vi /home/ec2-user/apache-drill-1.0.0/conf/core-site.xml <configuration> <property> <name>fs.s3.awsAccessKeyId</name> <value>YOUR_ACCESS_KEY</value> </property> <property> <name>fs.s3.awsSecretAccessKey</name> <value>YOUR_SECRET_KEY</value> </property> <property> <name>fs.s3n.awsAccessKeyId</name> <value>YOUR_ACCESS_KEY</value> </property> <property> <name>fs.s3n.awsSecretAccessKey</name> <value>YOUR_SECRET_KEY</value> </property> </configuration>
Drillを起動し、http://EC2のIPアドレス:8047/にアクセスすると、以下のような画面が表示されます。[Storage]をクリックします。
するとストレージプラグインの一覧が表示されます。まずdfsの[Update]ボタンをクリックします。
で、テキストエリアの内容をごっそりコピーします。[Back]ボタンで戻ります。
画面下部の[New Storage Plugin]で、名前をつけて(今回は"s3"という名前にしました)、[Create]ボタンをクリックします。
Configuration画面が開くので、さっきコピーした内容を張付けた上で、"file:///"となっていた箇所を"s3n://YOUR_BUCKET_NAME"に書き換えます。(s3では無くs3nであることに注意。s3と記述しても繋がらず、コメントを参考にs3nにしたら繋がりました)
これで準備完了。S3の対象バケットにjsonファイルを配置します。
さて、SQLクエリを実行!
0: jdbc:drill:zk=local> select * from `s3`.`data3.json`; +---------------+-----+----------+ | dir0 | id | name | +---------------+-----+----------+ | smokeymonkey | 1 | father | | smokeymonkey | 2 | mother | | smokeymonkey | 3 | brother | +---------------+-----+----------+ 3 rows selected (1.787 seconds)
出来た!S3に配置されたファイルに対して直接SQLクエリが発行出来ました!
さいごに
やぁ、Drillすごい。すごい便利ですよこれ。CSVやJSONファイルを、特殊な処理をすること無く検索や解析ができるってすごいことだと思います。なお、Apache DrillはTableau 9 Serverとも接続可能なそうなので、近いうちにブログ記事が出ることでしょう!楽しみにしていてください!